PLS-SEM demo: Young people’s perceived service quality and environmental performance of hybrid electric bus.

R you ready? Intro to SEM in R.

Published

March 7, 2023

1 Sample study

2 Libraries

# Library
library(tidyverse)
library(readxl)
library(janitor)
library(seminr)
library(psych)
library(MVN)

3 Data

## data
case_data <- read_csv("data/e_bus_customer_satisfaction.csv") %>% 
 clean_names()

case_data_items <- case_data %>%
 select(bt1:bt7, bd1:bd4, emp1:emp5, cs1:cs3, ep1:ep4, ls1:ls5)

4 Exploratory factor analysis

4.1 Scree plot

## Scree plot using parallel analysis
fa.parallel(case_data_items, fa = "fa")

Parallel analysis suggests that the number of factors =  6  and the number of components =  NA 

4.2 Factor extraction

## Factor loading
bus_fa <- fa(r = case_data_items,
             nfactors = 6,
             rotate = "varimax")

print(bus_fa$loadings, sort = TRUE, cutoff = 0.4)

Loadings:
     MR2   MR1   MR3   MR4   MR6   MR5  
ls1  0.820                              
ls2  0.891                              
ls3  0.828                              
ls4  0.806                              
ls5  0.599                              
bt1        0.673                        
bt2        0.666                        
bt4        0.549                        
bt5        0.680                        
bt6        0.578                        
bt7        0.550                        
ep1              0.864                  
ep2              0.900                  
ep3              0.690                  
ep4              0.705                  
emp1                   0.688            
emp2                   0.662            
emp3                   0.636            
emp4                   0.697            
emp5                   0.502            
bd1                          0.679      
bd2                          0.640      
bd3                          0.676      
bd4                          0.629      
cs1                                0.774
cs2                                0.817
cs3                                0.768
bt3        0.476                        

                 MR2   MR1   MR3   MR4   MR6   MR5
SS loadings    3.477 3.363 3.081 2.658 2.429 2.297
Proportion Var 0.124 0.120 0.110 0.095 0.087 0.082
Cumulative Var 0.124 0.244 0.354 0.449 0.536 0.618

5 Partial-least square SEM

5.1 Specifying the measurement model

pls_mm_ebus <- 
  constructs(
  composite("tangible", multi_items("bt", c(1:2, 5:7))),
  composite("drivers_quality", multi_items("bd", 1:4)),
  composite("empathy", multi_items("emp", 1:5)),
  composite("env_perf", multi_items("ep", 1:4)),
  composite("customer_sat", multi_items("cs", 1:3)),
  composite("life_sat", multi_items("ls", 1:5))
)

plot(pls_mm_ebus)

5.2 Specifying the structural model

pls_sm_ebus <- 
  relationships(
  paths(from = c("tangible", "drivers_quality", "empathy", "env_perf"),
        to = "customer_sat"),
  paths(from = "customer_sat", to = "life_sat")
)

plot(pls_sm_ebus)

5.3 Estimating PLS-SEM model

pls_model_ebus <- 
  estimate_pls(
  data = case_data,
  measurement_model = pls_mm_ebus,
  structural_model = pls_sm_ebus
)


plot(pls_model_ebus)
summary_pls_model_ebus <- summary(pls_model_ebus)
summary_pls_model_ebus

Results from  package seminr (2.3.2)

Path Coefficients:
                customer_sat life_sat
R^2                    0.448    0.077
AdjR^2                 0.440    0.074
tangible               0.179        .
drivers_quality        0.146        .
empathy                0.310        .
env_perf               0.237        .
customer_sat               .    0.278

Reliability:
                alpha  rhoC   AVE  rhoA
tangible        0.830 0.880 0.595 0.831
drivers_quality 0.856 0.902 0.698 0.857
empathy         0.825 0.876 0.586 0.840
env_perf        0.920 0.944 0.808 0.926
customer_sat    0.941 0.962 0.895 0.944
life_sat        0.903 0.929 0.724 0.911

Alpha, rhoC, and rhoA should exceed 0.7 while AVE should exceed 0.5

5.4 Bootstraping PLS-SEM

## bootstrapping PLS-SEM model
boot_pls_model_ebus <- bootstrap_model(seminr_model = pls_model_ebus,
                nboot = 1000)

## summary results
summary_boot_pls_model_ebus <- summary(boot_pls_model_ebus, alpha = 0.10)
summary_boot_pls_model_ebus

Results from Bootstrap resamples:  1000

Bootstrapped Structural Paths:
                                  Original Est. Bootstrap Mean Bootstrap SD
tangible  ->  customer_sat                0.179          0.180        0.062
drivers_quality  ->  customer_sat         0.146          0.142        0.070
empathy  ->  customer_sat                 0.310          0.313        0.068
env_perf  ->  customer_sat                0.237          0.238        0.051
customer_sat  ->  life_sat                0.278          0.289        0.051
                                  T Stat. 5% CI 95% CI
tangible  ->  customer_sat          2.888 0.082  0.284
drivers_quality  ->  customer_sat   2.095 0.024  0.258
empathy  ->  customer_sat           4.588 0.200  0.424
env_perf  ->  customer_sat          4.635 0.152  0.320
customer_sat  ->  life_sat          5.418 0.203  0.372

Bootstrapped Weights:
                         Original Est. Bootstrap Mean Bootstrap SD T Stat.
bt1  ->  tangible                0.233          0.234        0.029   8.078
bt2  ->  tangible                0.273          0.273        0.027   9.984
bt5  ->  tangible                0.265          0.266        0.029   9.079
bt6  ->  tangible                0.266          0.265        0.024  10.868
bt7  ->  tangible                0.259          0.257        0.024  10.918
bd1  ->  drivers_quality         0.294          0.293        0.021  13.906
bd2  ->  drivers_quality         0.289          0.289        0.021  13.623
bd3  ->  drivers_quality         0.313          0.314        0.023  13.321
bd4  ->  drivers_quality         0.301          0.301        0.018  16.538
emp1  ->  empathy                0.236          0.236        0.024   9.715
emp2  ->  empathy                0.307          0.306        0.027  11.510
emp3  ->  empathy                0.185          0.184        0.030   6.223
emp4  ->  empathy                0.251          0.251        0.027   9.422
emp5  ->  empathy                0.321          0.322        0.029  11.026
ep1  ->  env_perf                0.241          0.240        0.018  13.623
ep2  ->  env_perf                0.282          0.282        0.013  22.318
ep3  ->  env_perf                0.314          0.316        0.027  11.709
ep4  ->  env_perf                0.277          0.277        0.027  10.324
cs1  ->  customer_sat            0.355          0.355        0.009  39.391
cs2  ->  customer_sat            0.369          0.370        0.011  34.191
cs3  ->  customer_sat            0.332          0.333        0.010  34.528
ls1  ->  life_sat                0.235          0.236        0.031   7.571
ls2  ->  life_sat                0.253          0.255        0.030   8.380
ls3  ->  life_sat                0.259          0.258        0.031   8.447
ls4  ->  life_sat                0.221          0.218        0.038   5.786
ls5  ->  life_sat                0.204          0.204        0.052   3.921
                         5% CI 95% CI
bt1  ->  tangible        0.185  0.281
bt2  ->  tangible        0.228  0.315
bt5  ->  tangible        0.221  0.317
bt6  ->  tangible        0.225  0.306
bt7  ->  tangible        0.218  0.298
bd1  ->  drivers_quality 0.258  0.327
bd2  ->  drivers_quality 0.254  0.325
bd3  ->  drivers_quality 0.277  0.353
bd4  ->  drivers_quality 0.272  0.333
emp1  ->  empathy        0.195  0.274
emp2  ->  empathy        0.268  0.353
emp3  ->  empathy        0.131  0.229
emp4  ->  empathy        0.207  0.293
emp5  ->  empathy        0.277  0.371
ep1  ->  env_perf        0.208  0.267
ep2  ->  env_perf        0.261  0.302
ep3  ->  env_perf        0.277  0.361
ep4  ->  env_perf        0.234  0.322
cs1  ->  customer_sat    0.339  0.370
cs2  ->  customer_sat    0.353  0.389
cs3  ->  customer_sat    0.317  0.348
ls1  ->  life_sat        0.188  0.285
ls2  ->  life_sat        0.210  0.306
ls3  ->  life_sat        0.209  0.306
ls4  ->  life_sat        0.154  0.275
ls5  ->  life_sat        0.117  0.286

Bootstrapped Loadings:
                         Original Est. Bootstrap Mean Bootstrap SD T Stat.
bt1  ->  tangible                0.763          0.763        0.037  20.586
bt2  ->  tangible                0.766          0.765        0.035  21.705
bt5  ->  tangible                0.767          0.766        0.032  23.832
bt6  ->  tangible                0.790          0.788        0.030  26.288
bt7  ->  tangible                0.772          0.770        0.034  22.979
bd1  ->  drivers_quality         0.834          0.833        0.022  38.677
bd2  ->  drivers_quality         0.823          0.821        0.025  32.829
bd3  ->  drivers_quality         0.858          0.858        0.017  51.607
bd4  ->  drivers_quality         0.826          0.825        0.027  30.793
emp1  ->  empathy                0.768          0.766        0.029  26.148
emp2  ->  empathy                0.799          0.797        0.028  28.183
emp3  ->  empathy                0.699          0.697        0.046  15.222
emp4  ->  empathy                0.794          0.792        0.031  25.308
emp5  ->  empathy                0.762          0.763        0.028  27.095
ep1  ->  env_perf                0.905          0.903        0.018  49.791
ep2  ->  env_perf                0.947          0.946        0.010  98.357
ep3  ->  env_perf                0.875          0.875        0.020  44.265
ep4  ->  env_perf                0.866          0.865        0.028  30.751
cs1  ->  customer_sat            0.944          0.944        0.012  76.924
cs2  ->  customer_sat            0.960          0.960        0.006 150.747
cs3  ->  customer_sat            0.934          0.933        0.015  63.827
ls1  ->  life_sat                0.874          0.873        0.024  36.700
ls2  ->  life_sat                0.915          0.915        0.015  59.672
ls3  ->  life_sat                0.885          0.884        0.026  33.863
ls4  ->  life_sat                0.854          0.851        0.024  35.463
ls5  ->  life_sat                0.711          0.709        0.049  14.479
                         5% CI 95% CI
bt1  ->  tangible        0.701  0.820
bt2  ->  tangible        0.705  0.819
bt5  ->  tangible        0.711  0.815
bt6  ->  tangible        0.736  0.834
bt7  ->  tangible        0.711  0.822
bd1  ->  drivers_quality 0.797  0.866
bd2  ->  drivers_quality 0.778  0.859
bd3  ->  drivers_quality 0.829  0.883
bd4  ->  drivers_quality 0.778  0.865
emp1  ->  empathy        0.715  0.811
emp2  ->  empathy        0.746  0.840
emp3  ->  empathy        0.617  0.762
emp4  ->  empathy        0.740  0.841
emp5  ->  empathy        0.715  0.806
ep1  ->  env_perf        0.869  0.928
ep2  ->  env_perf        0.928  0.959
ep3  ->  env_perf        0.842  0.905
ep4  ->  env_perf        0.812  0.906
cs1  ->  customer_sat    0.922  0.961
cs2  ->  customer_sat    0.949  0.970
cs3  ->  customer_sat    0.907  0.954
ls1  ->  life_sat        0.830  0.908
ls2  ->  life_sat        0.891  0.938
ls3  ->  life_sat        0.836  0.922
ls4  ->  life_sat        0.808  0.887
ls5  ->  life_sat        0.618  0.782

Bootstrapped HTMT:
                                  Original Est. Bootstrap Mean Bootstrap SD
tangible  ->  drivers_quality             0.667          0.666        0.063
tangible  ->  empathy                     0.440          0.442        0.068
tangible  ->  env_perf                    0.535          0.536        0.053
tangible  ->  customer_sat                0.551          0.550        0.058
tangible  ->  life_sat                    0.378          0.384        0.069
drivers_quality  ->  empathy              0.606          0.606        0.056
drivers_quality  ->  env_perf             0.470          0.471        0.063
drivers_quality  ->  customer_sat         0.565          0.564        0.049
drivers_quality  ->  life_sat             0.279          0.285        0.070
empathy  ->  env_perf                     0.424          0.427        0.056
empathy  ->  customer_sat                 0.596          0.596        0.051
empathy  ->  life_sat                     0.262          0.274        0.070
env_perf  ->  customer_sat                0.532          0.533        0.048
env_perf  ->  life_sat                    0.320          0.323        0.062
customer_sat  ->  life_sat                0.300          0.305        0.057
                                  5% CI 95% CI
tangible  ->  drivers_quality     0.557  0.762
tangible  ->  empathy             0.324  0.548
tangible  ->  env_perf            0.447  0.623
tangible  ->  customer_sat        0.454  0.640
tangible  ->  life_sat            0.274  0.497
drivers_quality  ->  empathy      0.511  0.692
drivers_quality  ->  env_perf     0.367  0.573
drivers_quality  ->  customer_sat 0.478  0.646
drivers_quality  ->  life_sat     0.171  0.399
empathy  ->  env_perf             0.336  0.518
empathy  ->  customer_sat         0.509  0.674
empathy  ->  life_sat             0.158  0.386
env_perf  ->  customer_sat        0.451  0.610
env_perf  ->  life_sat            0.222  0.422
customer_sat  ->  life_sat        0.206  0.396

Bootstrapped Total Paths:
                                  Original Est. Bootstrap Mean Bootstrap SD
tangible  ->  customer_sat                0.179          0.180        0.062
tangible  ->  life_sat                    0.050          0.052        0.021
drivers_quality  ->  customer_sat         0.146          0.142        0.070
drivers_quality  ->  life_sat             0.041          0.041        0.022
empathy  ->  customer_sat                 0.310          0.313        0.068
empathy  ->  life_sat                     0.086          0.090        0.024
env_perf  ->  customer_sat                0.237          0.238        0.051
env_perf  ->  life_sat                    0.066          0.069        0.020
customer_sat  ->  life_sat                0.278          0.289        0.051
                                  5% CI 95% CI
tangible  ->  customer_sat        0.082  0.284
tangible  ->  life_sat            0.020  0.090
drivers_quality  ->  customer_sat 0.024  0.258
drivers_quality  ->  life_sat     0.007  0.080
empathy  ->  customer_sat         0.200  0.424
empathy  ->  life_sat             0.053  0.132
env_perf  ->  customer_sat        0.152  0.320
env_perf  ->  life_sat            0.039  0.102
customer_sat  ->  life_sat        0.203  0.372

5.5 Factor loadings

# DT::datatable(summary_boot_pls_model_ebus$bootstrapped_loadings %>% round(3))
summary_boot_pls_model_ebus$bootstrapped_loadings
                         Original Est. Bootstrap Mean Bootstrap SD T Stat.
bt1  ->  tangible                0.763          0.763        0.037  20.586
bt2  ->  tangible                0.766          0.765        0.035  21.705
bt5  ->  tangible                0.767          0.766        0.032  23.832
bt6  ->  tangible                0.790          0.788        0.030  26.288
bt7  ->  tangible                0.772          0.770        0.034  22.979
bd1  ->  drivers_quality         0.834          0.833        0.022  38.677
bd2  ->  drivers_quality         0.823          0.821        0.025  32.829
bd3  ->  drivers_quality         0.858          0.858        0.017  51.607
bd4  ->  drivers_quality         0.826          0.825        0.027  30.793
emp1  ->  empathy                0.768          0.766        0.029  26.148
emp2  ->  empathy                0.799          0.797        0.028  28.183
emp3  ->  empathy                0.699          0.697        0.046  15.222
emp4  ->  empathy                0.794          0.792        0.031  25.308
emp5  ->  empathy                0.762          0.763        0.028  27.095
ep1  ->  env_perf                0.905          0.903        0.018  49.791
ep2  ->  env_perf                0.947          0.946        0.010  98.357
ep3  ->  env_perf                0.875          0.875        0.020  44.265
ep4  ->  env_perf                0.866          0.865        0.028  30.751
cs1  ->  customer_sat            0.944          0.944        0.012  76.924
cs2  ->  customer_sat            0.960          0.960        0.006 150.747
cs3  ->  customer_sat            0.934          0.933        0.015  63.827
ls1  ->  life_sat                0.874          0.873        0.024  36.700
ls2  ->  life_sat                0.915          0.915        0.015  59.672
ls3  ->  life_sat                0.885          0.884        0.026  33.863
ls4  ->  life_sat                0.854          0.851        0.024  35.463
ls5  ->  life_sat                0.711          0.709        0.049  14.479
                         5% CI 95% CI
bt1  ->  tangible        0.701  0.820
bt2  ->  tangible        0.705  0.819
bt5  ->  tangible        0.711  0.815
bt6  ->  tangible        0.736  0.834
bt7  ->  tangible        0.711  0.822
bd1  ->  drivers_quality 0.797  0.866
bd2  ->  drivers_quality 0.778  0.859
bd3  ->  drivers_quality 0.829  0.883
bd4  ->  drivers_quality 0.778  0.865
emp1  ->  empathy        0.715  0.811
emp2  ->  empathy        0.746  0.840
emp3  ->  empathy        0.617  0.762
emp4  ->  empathy        0.740  0.841
emp5  ->  empathy        0.715  0.806
ep1  ->  env_perf        0.869  0.928
ep2  ->  env_perf        0.928  0.959
ep3  ->  env_perf        0.842  0.905
ep4  ->  env_perf        0.812  0.906
cs1  ->  customer_sat    0.922  0.961
cs2  ->  customer_sat    0.949  0.970
cs3  ->  customer_sat    0.907  0.954
ls1  ->  life_sat        0.830  0.908
ls2  ->  life_sat        0.891  0.938
ls3  ->  life_sat        0.836  0.922
ls4  ->  life_sat        0.808  0.887
ls5  ->  life_sat        0.618  0.782

5.6 Validity and reliability

# DT::datatable(summary_pls_model_ebus$reliability %>% round(3))
## Reliability measurment 
summary_pls_model_ebus$reliability
                alpha  rhoC   AVE  rhoA
tangible        0.830 0.880 0.595 0.831
drivers_quality 0.856 0.902 0.698 0.857
empathy         0.825 0.876 0.586 0.840
env_perf        0.920 0.944 0.808 0.926
customer_sat    0.941 0.962 0.895 0.944
life_sat        0.903 0.929 0.724 0.911

Alpha, rhoC, and rhoA should exceed 0.7 while AVE should exceed 0.5

5.7 Discriminant validity

## Fornell-Larcker criterion results
summary_pls_model_ebus$validity$fl_criteria
                tangible drivers_quality empathy env_perf customer_sat life_sat
tangible           0.772               .       .        .            .        .
drivers_quality    0.562           0.835       .        .            .        .
empathy            0.377           0.524   0.765        .            .        .
env_perf           0.471           0.421   0.380    0.899            .        .
customer_sat       0.489           0.509   0.544    0.500        0.946        .
life_sat           0.326           0.249   0.237    0.293        0.278    0.851

FL Criteria table reports square root of AVE on the diagonal and construct correlations on the lower triangle.

5.7.1 Heterotrait-Monotrait ratio

summary_pls_model_ebus$validity$htmt
                tangible drivers_quality empathy env_perf customer_sat life_sat
tangible               .               .       .        .            .        .
drivers_quality    0.667               .       .        .            .        .
empathy            0.440           0.606       .        .            .        .
env_perf           0.535           0.470   0.424        .            .        .
customer_sat       0.551           0.565   0.596    0.532            .        .
life_sat           0.378           0.279   0.262    0.320        0.300        .

5.7.2 VIF

summary_pls_model_ebus$vif_antecedents
customer_sat :
       tangible drivers_quality         empathy        env_perf 
          1.624           1.783           1.445           1.392 

life_sat :
customer_sat 
           .